const db = require('../db/index.js')
// 导入加密中间件
const bcrypt = require('bcryptjs')
// 导入jwt,用于生成DOMTokenList
const jwt = require('jsonwebtoken')
const jwtConfig = require('../jwt-config/index.js')
const { jwtSecreKey } = require('../jwt-config/index.js')
// 导入jwt配置文件，用于加密跟解密
exports.register = (req,res) =>{
	// req是前端传过来的数据，res是返回前端的数据
	const reginfo = req.body
	//第一步判断前端传过来数据是否为空
	if(!reginfo.account||!reginfo.password){
		return res.send({
			status:1,
			message:'账号或者密码不能为空'
		})
	}
	// 第二步，判断前端传过来账号有没有已经存在数据表中
	// 需要使用mysql的select 语句
	const sql = 'select * from users where account = ?'
	// 第一个参数是执行语句，第二个是参数，第三个是一个函数，用于处理结果
	db.query(sql,reginfo.account,(err,results)=>{
		if(results.length>0){
			return res.send({
				status:1,
				message:'账号已存在'
			})
		}
		// 第三步，对密码进行加密
		// 需要使用加密中间件 bcrypt.js
		const salt = bcrypt.genSaltSync(10); 
		reginfo.password = bcrypt.hashSync(reginfo.password,salt)
		//第四部把账号密码插入users表里面
		const sql1 = 'insert into users set ?'
		
		//注册身份
		const identity = '用户'
		//注册时间
		const create_time = new Date()
		db.query(sql1,{
			account:reginfo.account,
			password:reginfo.password,
			identity,
			create_time,
			//初始状态
			status:0
		},(err,results)=>{
			//results.affectedRows 为影响行数，如果插入失败，那么久没有影响到行数，也就行数不唯一
			if(results.affectedRows!==1){
				return res.send({
					status:1,
					message:'注册账号失败!'
				})
			}
			return res.send({
				status:1,
				message:'注册账号成功'
			})
		})
	})
}

exports.login = (req,res)=>{
	const loginfo = req.body
	
	// 第一步查看数据表中有没有前端传过来账号
	const sql = 'select * from users where account = ?'
	db.query(sql,loginfo.account,(err,results)=>{
		//执行sql语句失败情况 一般在数据库断开情况执行失败
		if(err) return res.cc(err)
		if(results.length!==1)return res.cc('登录失败')
		// 第二步 对前端传过来的密码进行解密
		const compareResult = bcrypt.compareSync(loginfo.password,results[0].password)
		if(!compareResult){
			return res.cc('登录失败')
		}
		//第三步 对账号是否被冻结做判断
		if(results[0].status==1){
			return res.cc('账号被冻结')
		}
		// 第三步 生成返回给前端的token 
		// 剔除加密后的密码，头像，创建时间，更新时间
		const user = {
			...results[0],
			password:'',
			imageUrl:'',
			create_time:'',
			update_time:''
		}
		// 设置token的有效时长 有效期为7个小时
		const tokenStr = jwt.sign(user,jwtConfig.jwtSecreKey,{
			expiresIn:'7h'
		})
		
		res.send({
			results:results[0],
			status:0,
			message:'登录成功',
			token:'Bearer'+ tokenStr
		})
	})
}